来电自动接听 您所在的位置:网站首页 auto answer自动接听 来电自动接听

来电自动接听

2024-05-03 10:17| 来源: 网络整理| 查看: 265

来电自动接听来电自动接听

Description

Analysis

Solution

Summary

1 . Description在MINI软件开发过程中,需要有个辅助功能即有来电时,控制手机能自动接听电话功能。在MTK的EngineerMode中,有可以自己接听功能的开关,可以参考MTK的做法,适当修改达到MINI版本要求。但是后面发现将该功能做到MtkDialer中时,如果后续需要更换MtkDialer则又需要重新开发该辅助功能,所以期望将这个辅助功能在其他稳定存在模块中开发,来隔离这种变化产生的影响。

2 . Analysis在接到电话后,会进入文件vendor/mediatek/proprietary/packages/services/Telecomm/src/com/android/server/telecom/CallsManager.java中的onCallFilteringComplete方法中,该方法如下所示:

public void onCallFilteringComplete(Call incomingCall, CallFilteringResult result) { // Only set the incoming call as ringing if it isn't already disconnected. It is possible // that the connection service disconnected the call before it was even added to Telecom, in // which case it makes no sense to set it back to a ringing state. if (incomingCall.getState() != CallState.DISCONNECTED && incomingCall.getState() != CallState.DISCONNECTING) { setCallState(incomingCall, CallState.RINGING, result.shouldAllowCall ? "successful incoming call" : "blocking call"); } else { Log.i(this, "onCallFilteringCompleted: call already disconnected."); return; } if (result.shouldAllowCall) { if (MtkUtil.isInSingleVideoCallMode(incomingCall)) { if (shouldBlockCallUnderSingleVideo(incomingCall)) { Log.i(TAG, "[isIncomingCallPermitted] Already has video call." + " or other call in the same phone account with differ video state"); rejectCallAndLog(incomingCall); return; } } if (hasMaximumManagedRingingCalls(incomingCall)) { if (shouldSilenceInsteadOfReject(incomingCall)) { incomingCall.silence(); } else { Log.i(this, "onCallFilteringCompleted: Call rejected! " + "Exceeds maximum number of ringing calls."); rejectCallAndLog(incomingCall); } /** * M: [CTA] Don't reject incoming call while dialing. * Requirements comes from CTA cases(6.2.2.3.5) that should allow incoming call while * dialing for DSDA phone. We add a flow to guarantee there no conflict for co-exist * incoming call and dialing call. (If user accept incoming call, the dialing one would * be disconnected) } else if (hasMaximumManagedDialingCalls(incomingCall)) { Log.i(this, "onCallFilteringCompleted: Call rejected! Exceeds maximum number of " + "dialing calls."); rejectCallAndLog(incomingCall); */ } else { /*表示接听*/ addCall(incomingCall); } } else { if (result.shouldReject) { Log.i(this, "onCallFilteringCompleted: blocked call, rejecting."); incomingCall.reject(false, null); } if (result.shouldAddToCallLog) { Log.i(this, "onCallScreeningCompleted: blocked call, adding to call log."); if (result.shouldShowNotification) { Log.w(this, "onCallScreeningCompleted: blocked call, showing notification."); } mCallLogManager.logCall(incomingCall, Calls.MISSED_TYPE, result.shouldShowNotification); } else if (result.shouldShowNotification) { Log.i(this, "onCallScreeningCompleted: blocked call, showing notification."); mMissedCallNotifier.showMissedCallNotification( new MissedCallNotifier.CallInfo(incomingCall)); } } }

3 . Solution添加一个handler,处理自动接听的功能,判断如果属性值ro.mmitest为true,则自动接听电话。

//Added begin import android.os.Message; private static final int DELAY_AUTO_ANSWER = 125; private Handler mAutoAnswerHandler = new Handler() { public void handleMessage(Message msg) { if (DELAY_AUTO_ANSWER == msg.what) { applyAutoAnswerCall((Call) msg.obj); } } }; private void applyAutoAnswerCall(Call incomingCall) { Log.d(this, "applyAutoAnswerCall~~"); try { if ( SystemProperties.getBoolean("ro.mmitest", false)) { if (null != incomingCall) { Log.v(TAG, "AutoAnswer cause of flag = true or ro.mmitest = true"); //Use this API to keep auto answer behavior is the same as manual answer call answerCall(incomingCall, VideoProfile.STATE_BIDIRECTIONAL); } } } catch (Exception e) { e.printStackTrace(); } } //Added end

然后需要在来电时,发送Message来启动handler。代码修改如下:

public void onCallFilteringComplete(Call incomingCall, CallFilteringResult result) { .... /** * M: [CTA] Don't reject incoming call while dialing. * Requirements comes from CTA cases(6.2.2.3.5) that should allow incoming call while * dialing for DSDA phone. We add a flow to guarantee there no conflict for co-exist * incoming call and dialing call. (If user accept incoming call, the dialing one would * be disconnected) } else if (hasMaximumManagedDialingCalls(incomingCall)) { Log.i(this, "onCallFilteringCompleted: Call rejected! Exceeds maximum number of " + "dialing calls."); rejectCallAndLog(incomingCall); */ } else { /*表示接听*/ addCall(incomingCall); //Added begin mAutoAnswerHandler.sendMessageDelayed(mAutoAnswerHandler.obtainMessage(DELAY_AUTO_ANSWER, incomingCall), 3000); //Added end } } else { if (result.shouldReject) { Log.i(this, "onCallFilteringCompleted: blocked call, rejecting."); incomingCall.reject(false, null); } if (result.shouldAddToCallLog) { Log.i(this, "onCallScreeningCompleted: blocked call, adding to call log."); if (result.shouldShowNotification) { Log.w(this, "onCallScreeningCompleted: blocked call, showing notification."); } mCallLogManager.logCall(incomingCall, Calls.MISSED_TYPE, result.shouldShowNotification); } else if (result.shouldShowNotification) { Log.i(this, "onCallScreeningCompleted: blocked call, showing notification."); mMissedCallNotifier.showMissedCallNotification( new MissedCallNotifier.CallInfo(incomingCall)); } } }

4 . Summary本次修改主要是将自动接听功能从dialer模块中转移到telecom模块中,这样如果在更换dialer情况下不用再次take一遍前面写的代码。在dialer进行逻辑判断,如果是ro.mmitest为true(即mini版本),延时3秒进行自动接听。前面其实用过将自动接听功能在engineer mode中开发,因为该mode中已经有相关逻辑,只需要打开相应开关就可以了,但是考虑到mini版本可能在做开机优化时会将engineer mode去掉而导致该自动接听功能失效,所以最终还是考虑使用将自动接听功能放在比较稳定的telecom模块这种比较稳妥做法。


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有